display: Add vfunc for get_monitor_at_window
authorOlivier Fourdan <ofourdan@redhat.com>
Tue, 17 May 2016 11:09:23 +0000 (13:09 +0200)
committerOlivier Fourdan <ofourdan@redhat.com>
Wed, 18 May 2016 17:07:27 +0000 (19:07 +0200)
Some backends (namely Wayland) do not support global coordinates so
using the window position to determine the monitor will always fail on
such backends.

In such cases, the backend itself might be better suited to identify
the monitor a given window resides on.

Add a vfunc get_monitor_at_window() to the display class so that we can
use the backend to retrieve the monitor, if the backend implements it.

https://bugzilla.gnome.org/show_bug.cgi?id=766566

gdk/gdkdisplay.c
gdk/gdkdisplayprivate.h

index 5e2fa873ebe1cc17b8184fa1fabc903486b0c599..9e638dceecf8743f9c433c7d438016178021fe02 100644 (file)
@@ -2692,9 +2692,20 @@ gdk_display_get_monitor_at_window (GdkDisplay *display,
   int n_monitors, i;
   int area = 0;
   GdkMonitor *best = NULL;
+  GdkWindowImplClass *impl_class;
+  GdkDisplayClass *class;
 
   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
 
+  class = GDK_DISPLAY_GET_CLASS (display);
+  if (class->get_monitor_at_window)
+    {
+      best = class->get_monitor_at_window (display, window);
+
+      if (best)
+        return best;
+    }
+
   gdk_window_get_geometry (window, &win.x, &win.y, &win.width, &win.height);
   gdk_window_get_origin (window, &win.x, &win.y);
 
index c8bc7124f8468de438399b44082c6373770f15ac..4b5a0094804e9ec86413ca2e6570a27e99732d52 100644 (file)
@@ -246,6 +246,8 @@ struct _GdkDisplayClass
   GdkMonitor *           (*get_monitor)                (GdkDisplay     *display,
                                                         int             index);
   GdkMonitor *           (*get_primary_monitor)        (GdkDisplay     *display);
+  GdkMonitor *           (*get_monitor_at_window)      (GdkDisplay     *display,
+                                                        GdkWindow      *window);
 
   /* Signals */
   void                   (*opened)                     (GdkDisplay     *display);